// 基于axios封装, 网络请求的函数
import axios from 'axios'
// 引入store对象
import store from '@/store'
import router from '@/router'
import { Message } from 'element-ui'

// 后台基地址
export const baseURL = 'http://big-event-vue-api-t.itheima.net'
const myAxios = axios.create({
  baseURL: baseURL
})

// 定义请求拦截器
// api 里每次调用 request 都会先执行这个请求拦截器
myAxios.interceptors.request.use(function (config) {
  // console.log(config)
  // 判断，登陆页面和注册页面，vuex里没有token，登陆接口和注册接口也不需要携带token(其他页面需要)
  if (store.state.token) {
    config.headers.Authorization = store.state.token
  }
  return config
}, function (error) {
  // 请求发起前的代码，如果有异常报错，会直接进入这里
  return Promise.reject(error)
  // 等同于
  // return new Promise((resolve, reject) => { reject(error) })
})

// 定义响应拦截器
myAxios.interceptors.response.use(function (response) {
  // return 到 axios 原地 Promise 对象，作为成功的对象
  return response
}, function (error) {
  // console.dir(error)
  // 破坏 localStorage 里的值，刷新让vuex去除错误的token，导致401
  if (error.response.status === 401) {
    // 本次响应 token 过期
    // 清除 vuex 里的一切，切换到登录页面
    store.commit('updateToken', '')
    store.commit('updateUserInfo', {})

    // 跳转登录页面
    router.push('/login')

    Message.error('用户身份已过期!')
  }
  return Promise.reject(error)
})

export default myAxios
